/*
 * @Author: wuqingchun
 * @Date: 2024-07-31 16:24:24
 * @Description: 公用结构体定义
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-07-31 16:46:27
 */
#ifndef __EV_STRUCT_H__
#define __EV_STRUCT_H__


struct tagEVDispatcher;

/**
 * @brief 事件操作函数集合（operation functioin sets）
 * 结构体中定义了一系列函数指针，这些函数用于实现特定的功能。
 * 这种设计模式常用于内核中的各种子系统，如字符设备、块设备、网络接口等
 * 
 * pcName - 事件名称
 * Add    - 添加事件函数
 * Delete - 删除事件函数
 */
typedef struct tagEventOps
{
    const char* pcName;  // 事件名称
    int (*Add)();
    int (*Delete)();
}EVENT_OPS_S;

#define EV_FLAG_IO       0x01
#define EV_FLAG_TIMER    0x02
#define EV_FLAG_SIGNAL   0x04

/**
 * @brief 事件结构定义
 * 
 */
typedef struct tagEVEvent
{
    struct tagEVDispatcher* pstDP;
    int iEventFd;
    void (*pfCallback)(int, void*);
    void *pCBArg;
    unsigned int uiFlags;
}EV_EVENT_S;

/**
 * @brief 事件调度器操作函数集
 * 
 */
typedef struct tagEVDispatcherOps
{
    const char* pcName;
    struct tagEVDispatcher* (*Create)();
    void (*Destroy)(struct tagEVDispatcher*);
    int (*Dispatch)(struct tagEVDispatcher*);
    int (*AddEvent)(struct tagEVDispatcher*, EV_EVENT_S*);
    int (*DeleteEvent)();
}EV_DISPATCHER_OPS_S;


/**
 * @brief 事件调度器
 * 
 */
typedef struct tagEVDispatcher
{
    EV_DISPATCHER_OPS_S* pstOps;
    int aiPairFd[2];
    int iRunning;
    EV_EVENT_S* apstEvent[1024];
    EV_EVENT_S stSigEvent;
}EV_DISPATCHER_S;


#endif //__EV_STRUCT_H__